package com.jiantong.user.service;

import com.jiantong.user.enums.LoginType;
import com.jiantong.user.model.User;
import com.jiantong.user.model.UserProfile;
import io.terminus.common.model.Paging;
import io.terminus.common.model.Response;

import java.util.List;
import java.util.Map;

public interface UserReadService<T extends User> {

    /**
     * 根据用户id查询用户信息
     *
     * @param id 用户id
     * @return 对应的用户id
     */
    Response<T> findById(Long id);

    /**
     * 根据一组用户id查询
     *
     * @param listId
     * @return List<User>
     */
    Response<List<T>> findByIds(List<Long> listId);

    /**
     * 根据用户标识查询客户
     *
     * @param loginId   用户标识
     * @param loginType 用户标志类型
     * @return 对应的用户
     */
    Response<T> findBy(String loginId, LoginType loginType);

    /**
     * 用户登录, 首先检查用户是否存在, 其次检查状态是否正常, 最后检查密码是否匹配
     *
     * @param loginId   登录id
     * @param password  登录密码
     * @param loginType 登录类型
     * @return 如果登录成功, 则返回对应的用户
     */
    Response<T> login(String loginId, String password, LoginType loginType);

    /**
     * 检查用户是否存在
     *
     * @param loginId   用户标识
     * @param loginType 用户标识类型
     * @return 用户是否已存在
     */
    Response<Boolean> checkExist(String loginId, LoginType loginType);

    /**
     * 以用户id查询用户信息
     *
     * @param userId 用户id
     * @return 未找到时返回为null, 找到时返回用户信息
     */
    Response<UserProfile> findProfileByUserId(Long userId);


    /**
     * 根据userId查询用户
     *
     * @param userId
     * @return user
     */
    Response<User> findUserByUserId(Long userId);


    /**
     * 根据名字关键字模糊查询
     *
     * @param keyword
     * @return ids
     */
    Response<List<Long>> findIdsByName(String keyword);

    /**
     * 根据关键字对应名字分页模糊查询
     */
    Response<Paging<User>> findByKeywordName(Integer pageNo, Integer pageSize, String keyword);

    Response<List<User>> selectAlUser(Map criteria);

    Response<List<Long>> selectIds(Map criteria);
}
